/**
 * Multi-language related operations
 */
import type { LocaleType } from '/#/config'
// import { i18n } from './setupI18n';
import { useLocaleStoreWithOut } from '/@/store/modules/locale'
import { unref, computed } from 'vue'
import { loadLocalePool, setHtmlPageLang } from './helper'
import i18n from '.'
import moment from 'moment'
import 'moment/dist/locale/zh-cn'
moment.locale('zh-cn')
interface LangModule {
  message: Recordable
  dateLocale: Recordable
  dateLocaleName: string
}

function setI18nLanguage(locale: LocaleType) {
  const localeStore = useLocaleStoreWithOut()

  // if (i18n.mode === 'legacy') {
  //   i18n.global.locale = locale;
  // } else {
  //   (i18n.global.locale as any).value = locale;
  // }
  localeStore.setLocaleInfo({ locale })
  setHtmlPageLang(locale)
}

export function useLocale() {
  const localeStore = useLocaleStoreWithOut()
  const getLocale = computed(() => localeStore.getLocale)
  const getShowLocalePicker = computed(() => localeStore.getShowPicker)
  const getAntdLocale = computed((): any => i18n.getLocaleMessage(unref(getLocale))?.antdLocale ?? {})
  // Switching the language will change the locale of useI18n
  // And submit to configuration modification
  async function changeLocale(locale: LocaleType) {
    const currentLocale = unref(i18n.locale)
    if (currentLocale === locale) {
      return locale
    }

    if (loadLocalePool.includes(locale)) {
      setI18nLanguage(locale)
      return locale
    }
    const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule
    if (!langModule) return

    const { message } = langModule

    i18n.setLocaleMessage(locale, message)
    loadLocalePool.push(locale)

    setI18nLanguage(locale)
    return locale
  }

  return {
    getLocale,
    getShowLocalePicker,
    changeLocale,
    getAntdLocale,
  }
}
